package inputOutput;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;


import config.Config;
import ecole.infrastructure.Batiment;
import ecole.organisation.Ecole;

import reservation.Reservation;
/** 
 * methode de sérialiation des objets java
 * sérialise la liste des réservations
 * @author FAUCONNIER Simon LUTTIAU Hadrien Bennour Salah 
 *
 */
public class SerialisationBinaire extends Serialisation implements Serializable {
	private static final long serialVersionUID = 1L;
	private String pathEcoBin = Config.PATH_ECO_BIN;
	private String pathResBin = Config.PATH_RES_BIN;

	private String pathBatBin = Config.PATH_BAT_BIN;
	

	public SerialisationBinaire(){
		super();
	}

	/**
	 * Lance la sauvegarde de l'école
	 * Pour écrire les données, on stocke directement les listes dans le
	 * fichier.
	 * 
	 * @return true si la sauvegarde a réussi, false sinon
	 * @throws IOException 
	 */
	public void sauvegarder(Batiment batiment) throws IOException{
		System.out.println("Sauvegarde Batiment !");

		try{	    
		    // ouverture d'un flux de sortie vers le fichier "avions.serial"
		    FileOutputStream file = new FileOutputStream(pathBatBin);
		    
		    // création d'un "flux objet" avec le flux fichier
		    ObjectOutputStream oos= new ObjectOutputStream(file);
		    try {
			// sérialisation : écriture de l'objet dans le flux de sortie
			oos.writeObject(batiment); //mettre le tableau a sérialisé
			
			// on vide le tampon
			oos.flush();

		    } finally {
			//fermeture des flux
			try {
			    oos.close();
			} finally {
			    file.close();
			}
		    }
		} catch(IOException ioe) {
		    ioe.printStackTrace();
		}
		
	}


	/**
	 * Lance la sauvegarde de l'école
	 * Pour écrire les données, on stocke directement les listes dans le
	 * fichier.
	 * 
	 * @return true si la sauvegarde a réussi, false sinon
	 * @throws IOException 
	 */
	public void sauvegarder(Ecole ecole) throws IOException{
		System.out.println("Sauvegarde école !");

		try{	    
		    // ouverture d'un flux de sortie vers le fichier "avions.serial"
		    FileOutputStream file = new FileOutputStream(pathEcoBin);
		    
		    // création d'un "flux objet" avec le flux fichier
		    ObjectOutputStream oos= new ObjectOutputStream(file);
		  


		try {
			oos.writeObject(ecole);          
		
			// on vide le tampon
			oos.flush();
			
		    } finally {
			//fermeture des flux
			try {
			    oos.close();
			} finally {
			    file.close();
			}
		    }
		} catch(IOException ioe) {
		    ioe.printStackTrace();
		}
			

	}
	/**
         * Lance la sauvegarde des réservations
         * Pour écrire les données, on stocke directement les listes dans le
         * fichier.
         * 
         * @return true si la sauvegarde a réussi, false sinon
         * @throws IOException 
         */
        public void sauvegarder(List<Reservation> listeRes) throws IOException{
                System.out.println("Sauvegarde réservation !");
            	try{	    
            	    // ouverture d'un flux de sortie vers le fichier "avions.serial"
            	    FileOutputStream file = new FileOutputStream(pathResBin);
            	    
            	    // création d'un "flux objet" avec le flux fichier
            	    ObjectOutputStream oos= new ObjectOutputStream(file);
            	    try {
            		// sérialisation : écriture de l'objet dans le flux de sortie

            		oos.writeObject(listeRes); 
            		
            		// on vide le tampon
            		oos.flush();
            		
            	    } finally {
            		//fermeture des flux
            		try {
            		    oos.close();
            		} finally {
            		    file.close();
            		}
            	    }
            	} catch(IOException ioe) {
            	    ioe.printStackTrace();
            	}
                        
        }
	

	/**
	 * Lance le chargement de l'ecole. Pour
	 * lire les données, on récupère directement l'école à partir du fichier.
	 * 
	 * @return true si le chargement a réussi, false sinon
	 * @throws IOException 
	 * @throws Exception
	 */	
    public Batiment chargerBatiment() throws IOException {
    	try {
    	    // ouverture d'un flux d'entrée depuis le fichier "personne.serial"
    	    FileInputStream fis = new FileInputStream(pathBatBin);
    	    // création d'un "flux objet" avec le flux fichier
    	    ObjectInputStream ois= new ObjectInputStream(fis);
    	    try 
    		{	
    		    // désérialisation : lecture de l'[iobjet depuis le flux d'entrée
    		    batiment= (Batiment) ois.readObject(); 
    		 
    		} finally {
    		// on ferme les flux
    		try {
    		    ois.close();
    		} finally {
    		    fis.close();
    		}
    	    }
    	} catch(IOException ioe) {
    	    ioe.printStackTrace();
    	} catch(ClassNotFoundException cnfe) {
    	    cnfe.printStackTrace();
    	}
    	
    	return batiment;

	}

	
    /**
     * Lance le chargement des réservations. Pour
     * lire les données, on récupère directement l'école à partir du fichier.
     * 
     * @return true si le chargement a réussi, false sinon
     * @throws IOException 
     * @throws Exception
     */     
    public List<Reservation> chargerReservation() throws IOException {
    	try {
    	    // ouverture d'un flux d'entrée depuis le fichier "personne.serial"
    	    FileInputStream fis = new FileInputStream(pathResBin);
    	    // création d'un "flux objet" avec le flux fichier
    	    ObjectInputStream ois= new ObjectInputStream(fis);
    	    try 
    		{	
    		    // désérialisation : lecture de l'[iobjet depuis le flux d'entrée
    	    	reservation= (List<Reservation>)  ois.readObject(); 
    		   
    		    
    		} finally {
    		// on ferme les flux
    		try {
    		    ois.close();
    		} finally {
    		    fis.close();
    		}
    	    }
    	} catch(IOException ioe) {
    	    ioe.printStackTrace();
    	} catch(ClassNotFoundException cnfe) {
    	    cnfe.printStackTrace();
    	}
    	
    	
    	return reservation;
    }



    /**
     * Lance le chargement des réservations. Pour
     * lire les données, on récupère directement l'école à partir du fichier.
     * 
     * @return true si le chargement a réussi, false sinon
     * @throws IOException 
     * @throws Exception
     */     
    public Ecole chargerEcole() throws IOException {
    	try {
    	    // ouverture d'un flux d'entrée depuis le fichier "personne.serial"
    	    FileInputStream fis = new FileInputStream(pathResBin);
    	    // création d'un "flux objet" avec le flux fichier
    	    ObjectInputStream ois= new ObjectInputStream(fis);
    	    try 
    		{	
    		    // désérialisation : lecture de l'[iobjet depuis le flux d'entrée
    		    ecole = (Ecole) ois.readObject(); 
    		 
    		} finally {
    		// on ferme les flux
    		try {
    		    ois.close();
    		} finally {
    		    fis.close();
    		}
    	    }
    	} catch(IOException ioe) {
    	    ioe.printStackTrace();
    	} catch(ClassNotFoundException cnfe) {
    	    cnfe.printStackTrace();
    	}
    	
    	return ecole;
    }

}
